package com.hikvision.rpq.sblearn.scheduled;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author renpeiqian
 * @date 2021/9/7 16:25
 * @since
 */
@Component
@Slf4j
public class ScheduledTask {

    private static final ThreadLocal<Integer> threadLocalA = new ThreadLocal<>();


    /**
     * @Scheduled
     * 方法默认是按照顺序执行的，这会导致当一个任务挂死的情况下，其它任务都在等待，无法执行。
     * 当有多个方法使用@Schedule注解时，就会创建多个定时任务到任务列表中，
     * spring容器通过线程处理任务列表中的定时任务，采用的线程池参数为： coreSize ：1 队列 : DelayedWorkQueue （线程池中只有一个线程，当多个任务执行时，其中一个任务没有执行完时，其他任务在阻塞队列当中等待）
     * 因此，所有任务都是按照顺序执行的，只不过由于任务执行的速度相当快，感觉任务都是多线程执行的。
     * 如何改善： 更改定时任务线程池的参数
     */

    @Scheduled(cron = "0/2 * * * * ?")
    public void taskA() {
        try {
            log.info("执行了ScheduleTask类中的taskA方法");
            Thread.sleep(TimeUnit.SECONDS.toMillis(10));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Scheduled(cron = "0/1 * * * * ?")
    public void taskB() {
        int num = threadLocalA.get() == null ? 0 : threadLocalA.get();
        log.info("taskB方法执行次数：{}", ++num);
        threadLocalA.set(num);

    }

}
